- Spring Boot是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。使用 “约定大于配置” 思想进行了许多默认配置,从而使开发人员不再需要定义样板化的配置。
- Spring
Boot配置中使用spring-boot-starter-parent管理依赖,所有依赖继承于parent依赖,实现了依赖的版本的自动配置,避免了依赖的版本冲突
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.0</version>
</parent>
- Spring Boot默认配置了很多项目框架的使用方式,整合了所有的框架的默认配置,实现了自动配置,降低了项目搭建的复杂度
<!-- web项目spring相关所有依赖,spring-web、spring-mvc、aop…等 -->
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
- Spring
Boot有以下特性:
- 版本最低要求jdk1.8(jdk8)
- 所有框架依赖,无需版本标注,一次提供
- 直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)
- 不需要xml配置,全部配置文件整合在aplication.properties文件
- 提供生产就绪的特性,例如度量、健康检查和外部化配置
执行流程
- 在SpringApplication实例初始化的时候,它会提前做几件事情:
- 根据classpath里面是否存在 ConfigurableWebApplicationContext 来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。
- 推断并设置main方法的定义类。
- 方法执行首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用started()方法
- 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)
- 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法
- 如果SpringApplication的showBanner属性被设置为true,则打印banner。
- 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。
- ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。
- 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。
- 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。
- 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
- 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。
- 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
- 遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,会将异常信息一并传入处理)